﻿using BLLTarasca;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using Tarasca.Models;
using System.IO;

namespace Tarasca.Controllers
{
    public class AuthController : BaseController
    {
        [AllowAnonymous]
        public ActionResult Login(string returnUrl)
        {
            ViewBag.ReturnUrl = returnUrl;
            return View();
        }

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Login(LoginModel model, string returnUrl)
        {
            BLLUsuario bll = new BLLUsuario();

            if (bll.Autenticar(model.UserName, model.Password))
            {
                bll.GuardarCambios();
                Autenticar(model.UserName);
                return RedirectToAction("Index", "Cuentas");
            }

            return View(model);
        }

        private void Autenticar(string usuario)
        {
            FormsAuthentication.Initialize();
            FormsAuthenticationTicket fat = new FormsAuthenticationTicket(1, usuario, DateTime.Now, DateTime.Now.AddDays(30), true, @"", FormsAuthentication.FormsCookiePath);
            HttpContext.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(fat)));
        }

        public ActionResult CerrarSesion()
        {
            FormsAuthentication.SignOut();
            return RedirectToAction("Index", "Home");
        }

        [AllowAnonymous]
        public ActionResult Registrarse()
        {
            return View("Registrarse");
        }

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Registrarse(RegistrarseModel model)
        {
            string mensajeError = string.Empty;

            try
            {
                if (ValidarParametrosRegistro(model, out mensajeError))
                {
                    BLLUsuario bllUsuario = new BLLUsuario();
                    bllUsuario.CrearUsuario(model.Usuario, model.Contraseña, model.Email);
                    bllUsuario.GuardarCambios();
                    Autenticar(model.Usuario);
                    return RedirectToAction("Index", "Cuentas");
                }
                else
                    model.Error = mensajeError;
            }
            catch (BLLTarascaException ex)
            {
                model.Error = ex.Message;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return View("Registrarse", model);
        }

        private bool ValidarParametrosRegistro(RegistrarseModel model, out string mensajeError)
        {
            mensajeError = string.Empty;

            if (model.Usuario.Length < 6 || model.Usuario.Length > 20)
            {
                mensajeError = "El nombre de usuario debe tener entre 6 y 20 caracteres, forro!";
                return false;
            }
            else if (model.Contraseña.Length < 6 || model.Contraseña.Length > 20)
            {
                mensajeError = "La contraseña debe tener entre 6 y 20 caracteres, forro!";
                return false;
            }
            else if (!ValidarEmail(model.Email))
            {
                mensajeError = "E-mail inválido, forro!";
                return false;
            }
            
            return true;
        }

        public JsonResult UsuarioDisponible(string nombreUsuario)
        {
            bool disponible = !new BLLUsuario().Existe(nombreUsuario);
            return Json(new { NombreUsuario = nombreUsuario, Disponible = disponible }, JsonRequestBehavior.AllowGet);
        }

        public JsonResult EmailDisponible(string email)
        {
            bool disponible = !new BLLPerfil().Existe(email);
            return Json(new { Email = email, Disponible = disponible } , JsonRequestBehavior.AllowGet);
        }

        public ActionResult Recuperar()
        {
            return View("Recuperar");
        }

        public JsonResult EnviarRecuperacion(string valorChota)
        {
            BLLUsuario bllUsuario = new BLLUsuario();
            string emailDestino = string.Empty;
            string contraseñaRecuperacion = bllUsuario.GenerarContraseñaDeRecuperacion(valorChota, out emailDestino);
            EnviarEmailRecuperacion(emailDestino, contraseñaRecuperacion);
            bllUsuario.GuardarCambios();

            return Json(new { Email = emailDestino }, JsonRequestBehavior.AllowGet);
        }

        private void EnviarEmailRecuperacion(string emailDestino, string nuevaContraseña)
        {
            string path = Server.MapPath("~/Correos/Recuperazao.html");
            string html = System.IO.File.ReadAllText(path);

            Mailer mailer = new Mailer();
            Dictionary<string, string> variables = new Dictionary<string, string>();
            variables.Add("@nuevaContraseña", nuevaContraseña);
            mailer.EnviarEmail(emailDestino, "Recuperación de Contraseña", html, variables);
        }
    }
}
